package com.fmy.mcsecurity.token;

import com.fmy.mcsecurity.token.model.RefreshStorage;
import com.fmy.mcsecurity.token.model.SecurityToken;
import org.springframework.security.core.Authentication;

import java.util.List;

/**
 * @author Mr.fmy
 * @version 1.0.0
 * @Description TODO token储存接口
 * @createTime 2020/4/24 09:44
 */
public interface TokenStorage {


    /**
     * 根据 token 获取 user_key
     */
    String getUserKey(String token);

    /**
     * 根据获取 Authentication
     */
    Authentication getAuthentication(String userKey);

    /**
     * 更新 Authentication
     */
    void updateAuthentication(String userKey, Authentication authentication);

    /**
     * 设置 Authentication
     */
    void setAuthentication(String client, String type, String userKey, Authentication authentication, SecurityToken token);

    /**
     * 根据 user_key 获取 SecurityToken
     */
    List<SecurityToken> getToken(String userKey);

    /**
     * 获取刷新 token 对应的 Storage
     */
    RefreshStorage getRefreshTokenStorage(String refreshtoken);

    /**
     * 剔出
     */
    void kick(String token, String cause);

    /**
     * 按 user_key 剔出
     */
    void kickUserKey(String userKey, String cause);

    /**
     * 获取剔出原因
     */
    String getkickCause(String token);

    /**
     * 在 isConcurrency 为 True 的时候会调用改方法
     */
    void setAuthenticationConcurrency(String client, String type, String userKey, Authentication authentication, SecurityToken token);

    /**
     * 默认为0不限制，该限制为--同用户and同client登录
     */
    default int concurrency() {
        return 0;
    }
}
